热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

技能速成|一文带你学会MybatisPlus

一.MP简介我们知道,Mybatis属于一个半自动的ORM框架。之所以说Mybatis是一个半自动的ORM框架,原因是它还需要我们自己在注解或是映射文
一. MP简介

我们知道,Mybatis属于一个半自动的ORM框架。之所以说Mybatis是一个半自动的ORM框架,原因是它还需要我们自己在注解或是映射文件中编写SQL语句,并没有实现完全的自动化。SQL语句的编写,虽然增加了项目和业务需求实现的灵活性,但对一些基本表的操作而言,无疑增加了数据库操作的复杂度,显得没有那么方便。

而Mybatis-Plus则是全自动的ORM框架,按照开闭原则,在不影响Mybatis现有功能的情况下,实现了对Mybatis的功能增强。如果你之前有过Mybatis的使用经验,现在学习Mybatis-Plus简直就是手到擒来。

 今天壹哥就带大家来学习一下Mybatis-Plus框架的基本使用,请掏出小本本吧。

二. Mybatis-Plus特点

MP具有如下基本特点:

  1. 通过在实体类中与数据库表进行映射;

  2. 无需编写SQL语句,简化了CRUD操作;

  3. 通常适用于单表。



三. MP使用

接下来壹哥会在SpringBoot项目环境中,带着大家一起使用Mybatis-Plus。

1. 新建SpringBoot项目

创建SpringBoot项目的过程,壹哥在这里就给大家省略了,如果有不熟悉的同学,可以参考壹哥之前关于SpringBoot的教程文章,链接如下:

SpringBoot2.x系列教程汇总-从入门到精通

2. 添加核心依赖

我们在SpringBoot项目中添加需要用到的核心依赖包。

org.springframework.bootspring-boot-starter-webmysqlmysql-connector-java5.1.47com.baomidoumybatis-plus-boot-starter3.3.1.tmpcom.alibabadruid1.2.8org.projectlomboklomboktrue1.18.4junitjunit4.12org.slf4jslf4j-log4j121.6.4

在这里面比较重要的依赖包,就是今天我们要使用的mybatis-plus-boot-starter这个依赖了。

3. 创建SpringBoot启动程序

和其他SpringBoot项目的启动程序一样,此处也略过。

4. 配置文件

在配置文件中,我们主要编写的是数据库的连接信息,壹哥在这里使用的是properties格式的配置文件,也就是application.properties。当然大家也可以使用yml文件格式。

spring.datasource.password=数据库账号的登录密码
spring.datasource.username=数据库登录账号
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
server.port=8096
spring.application.name=MYBATISPLUSSERVER

 5. 编写实体类

由于mybatis-plus,可以不编写SQL语句。那么Java中的对象,到底该如何与数据库中的表进行映射呢?答案其实就在实体类中!我们可以通过不同的注解来完成实体类和具体表,以及实体类的属性和表中的列进行映射。这也是mybatis-plus中非常关键的一步,具体实现如下:

@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("emp") //告知mybatis-plus和数据库中的哪个表关联
public class User extends Model implements Serializable {//主键idprivate int id; //当实体类的属性名和和表中的列名相同,无需做任何设置@TableField("name") private String userName; //属性名和列名不一致时设置映射,用userName属性和表中的name列进行关联private int age;private String email;
}

6. 编写dao接口

我们这里的接口中,不必编写任何CRUD方法,只需要继承BaseMapper接口即可。通过阅读源码我们可以发现,在这个接口中其实已经封装了常见的CURD方法,源码如下:

所以,实体类中就可以省去CRUD方法的代码实现。

package com.qf.pro.dao;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qf.pro.pojo.User;public interface UserDao extends BaseMapper {//BaseMapper 默认封装了CRUD方法,通过泛型制定了所操作的实体类及表
}

7. 编写配置类

这样当SpringBoot启动时,就可以扫描到dao层代码所在的包。

package com.qf.mp2103.dao;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@MapperScan("com.qf.mp2103.dao")
public class MybatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor(){return new PaginationInterceptor();}
}

8. 业务实现

我们要在业务逻辑层里调用各种CRUD方法,这也是Mybatis-Plus比较核心、重要的点,MybatisPlus会根据之前的配置自动生成SQL语句。

package com.qf.mp2103.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qf.mp2103.dao.UsersDao;
import com.qf.mp2103.pojo.Users;
import com.qf.mp2103.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.HashMap;
import java.util.List;
import java.util.Map;@Service
public class UserServiceImpl implements UsersService {&#64;Autowiredprivate UsersDao usersDao;&#64;Overridepublic List findUsers() {//mybatisplus 自动生成/提供的查询方法//由于是无条件查询&#xff0c;参数nullreturn usersDao.selectList(null);}&#64;Overridepublic List findUsersByCondition(String name) {//创建QueryWrapper对象QueryWrapper wrapper&#61;new QueryWrapper();//通过wrapper对象来设置查询条件//参数1&#xff1a;字段表名//参数2&#xff1a;所赋值//eq 等于wrapper.eq("name",name);return usersDao.selectList(wrapper);}&#64;Overridepublic List findUsersByCondition2(int startAge, int endAge) {QueryWrapper wrapper&#61;new QueryWrapper();//年龄的范围wrapper.between("age",startAge,endAge);return usersDao.selectList(wrapper);}&#64;Overridepublic List findUsersByCondition3(Users users) {//多条件查询QueryWrapper wrapper&#61;new QueryWrapper();//where name&#61;&#39;&#39; and age <&#61;
// wrapper.eq(true,"name",users.getUserName());wrapper.le(true,"age",users.getAge());//where name&#61;&#39;&#39; or age >&#61;wrapper.eq(true,"name",users.getUserName());wrapper.ge(false,"age",users.getAge());return usersDao.selectList(wrapper);}&#64;Overridepublic List findUsersByCondition4(Users users) {//模糊查询QueryWrapper wrapper&#61;new QueryWrapper();//%关键字%wrapper.like("name",users.getUserName());//%明//wrapper.likeLeft()//李%//wrapper.likeRight();return usersDao.selectList(wrapper);}//排序查询&#64;Overridepublic List findUsers2() {QueryWrapper wrapper&#61;new QueryWrapper();//设置排序条件wrapper.orderByDesc("id");return usersDao.selectList(wrapper);}&#64;Overridepublic List findUsersByPage(int page, int size) {//用于分页查询//select * from users limit X,XQueryWrapper wrapper&#61;new QueryWrapper();int start&#61;(page-1)*size;//拼接wrapper.last("limit "&#43;start&#43;","&#43;size);return usersDao.selectList(wrapper);}&#64;Overridepublic List findUsers3() {//查询指定列QueryWrapper wrapper&#61;new QueryWrapper();//设置查询的列wrapper.select("id","email");return usersDao.selectList(wrapper);}&#64;Overridepublic boolean addUser(Users users) {//添加用户int result&#61;usersDao.insert(users);return result&#61;&#61;1;}&#64;Overridepublic boolean deleteUser(int id) {//删除用户--单个删除int result&#61;usersDao.deleteById(id);//批量删除//usersDao.deleteBatchIds(List list);return result&#61;&#61;1;}&#64;Overridepublic boolean updateUser(Users users) {//要求表中的主键列是id的名字&#xff0c;使用id列作为条件int result&#61;usersDao.updateById(users);//如果主键列的名字不是id,或者条件不是主键id
// QueryWrapper wrapper&#61;new QueryWrapper();
// wrapper.eq("email",users.getEmail());
// int result2&#61;usersDao.update(users,wrapper);return result&#61;&#61;1;}&#64;Overridepublic Users findUersById(int id) {//根据主键id查询单个对象return usersDao.selectById(id);}&#64;Overridepublic List findUsersByIds(List list) {//根据id批量查询return usersDao.selectBatchIds(list);}&#64;Overridepublic Map findUsersByPage2(int page, int size) {//如果还有其他条件查询&#xff0c;声明条件构造器进行//创建分页插件对象//参数1&#xff1a;显示第几页数据//参数2&#xff1a;每页显示几条数据Page page1&#61;new Page(page,size);//根据分页插件对象里的分页条件查询数据IPage iPage&#61;usersDao.selectPage(page1,null);Map map&#61;new HashMap();//获取总记录数 iPage.getTotal()map.put("totalCount",iPage.getTotal());//获取总页数 iPage.getPages()map.put("totalPage",iPage.getPages());//获取分页数据map.put("data",iPage.getRecords());return map;}&#64;Overridepublic List findUsers4(int age1, int age2, String email) {QueryWrapper queryWrapper&#61;new QueryWrapper();queryWrapper.ge("age",age1).le("age",age2).or().likeRight("email",email);return usersDao.selectList(queryWrapper);}&#64;Overridepublic Users findUsers5(int id) {//创建实体类对象Users user&#61;new Users();user.setId(id);//声明对象接收查询返回的结果Users getUser&#61;user.selectById(id);return getUser;}&#64;Overridepublic void addUsers2(Users users) {//添加方法users.insert();}&#64;Overridepublic void updateUsers2(Users users) {//根据主键更新users.updateById();}&#64;Overridepublic void deleteUsers2(Users users) {//根据主键删除users.deleteById();}public Users findOne(String name){//根据其他条件查询单个数据&#xff0c;如果多于1条数据&#xff0c;则报异常//条件构造器QueryWrapper queryWrapper&#61;new QueryWrapper();queryWrapper.eq("name",name);return usersDao.selectOne(queryWrapper);}//查询总记录数public int getUserCount(){//可以声明条件构造器return usersDao.selectCount(null);}}

这样通过以上几个步骤&#xff0c;我们就学会了Mybatis-Plus的基本使用&#xff0c;希望今天的文章可以教会大家如何使用Mybatis-Plus。如果你还有疑惑&#xff0c;可以私信我们哦。


推荐阅读
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文深入探讨了 Java 中的 Serializable 接口,解释了其实现机制、用途及注意事项,帮助开发者更好地理解和使用序列化功能。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本文介绍如何使用Java中的正则表达式来提取字符串中的特定值。通过示例代码和详细解释,帮助开发者掌握正则表达式的使用方法,尤其是如何匹配和提取复杂模式中的数据。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
author-avatar
jfgkj6454_478
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有